package com.wxh.util;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * @ClassName: DateUtils
 * @Description: 日期工具类
 * @Author wxh
 * @Date: 2019/8/14 9:54
 * @Version V1.0.0
 * @Since 1.8
 */
public final class DateUtils {
    private DateUtils(){

    }

    public static void main(String[] args) {
        System.out.println(currentYearMonthDay());
        System.out.println(currentHourMinuteSecondNa());
        System.out.println(currentHourMinuteSecond());
        // 当前年月日
        LocalDate nowDate = LocalDate.now();
        System.out.println(nowDate.getYear()+","+nowDate.getMonthValue()+","+nowDate.getDayOfMonth());
        // 特定日期
        System.out.println(LocalDate.of(2019,9,5));
        // 判断两个日期是否想到
        if(nowDate.equals(LocalDate.of(2019,9,5))){
            System.out.println("两个日期相等");
        }
        // 增加一小时
        System.out.println(currentHourMinuteSecond().plusHours(1));
        // 减去一小时
        System.out.println(currentHourMinuteSecond().minusHours(1));
        // 增加一年
        System.out.println(currentYearMonthDay().plusYears(1));
        // 减去一年
        System.out.println(currentYearMonthDay().minusYears(1));
        // 一周后日期
        System.out.println(nowDate.plus(1, ChronoUnit.WEEKS));
        // 日期转换为字符串
        System.out.println(localDateToString(nowDate));
        // 字符串转换为日期
        System.out.println(stringToLocalDate("2019-08-06"));

    }

    /**
     * 获取当前的年月日
     * @return LocalDate 本期日期对象
     */
    public static LocalDate currentYearMonthDay(){
        return LocalDate.now();
    }

    /**
     * 获取当前的时分秒纳秒(会多一点数据，如：10:04:37.273)
     * @return LocalTime 本期时间对象
     */
    public static LocalTime currentHourMinuteSecondNa(){
        return LocalTime.now();
    }

    /**
     * 获取当前的时分秒
     * @return LocalTime 本期时间对象
     */
    public static LocalTime currentHourMinuteSecond(){
        LocalTime now = LocalTime.now();
        return now.withNano(0);
    }

    /**
     *  将字符串转换为固定格式的日期
     * @param dateStr 时间字符串
     * @return LocalDate 本地日期
     */
    public static LocalDate stringToLocalDate(String dateStr){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(dateStr, dtf);
    }

    /**
     * 将日期转换为固定格式的字符串
     * @param localDate 本地日期
     * @return String 字符串
     */
    public static String localDateToString(LocalDate localDate){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return dtf.format(localDate);
    }

    /**
     * 将时间戳转换为本地日期时间
     * @param timestamp 时间戳
     * @return LocalDateTime本地日期时间
     */
    public static LocalDateTime timestampToLocalDate(long timestamp){
        Instant instant = Instant.ofEpochMilli(timestamp);
        ZoneId zoneId = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(instant, zoneId);
    }

    /**
     *  将本地日期时间转换为时间戳
     * @param localDateTime 本期日期时间
     * @return long
     */
    public static long localDateToTimestamp(LocalDateTime localDateTime){
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zoneId).toInstant();
        return instant.toEpochMilli();
    }

}
